/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sgs.mb;

import br.com.sgs.auxiliar.DepartamentoAux;
import br.com.sgs.auxiliar.SolicitacaoAux;
import br.com.sgs.bundle.MessageBundleLoader;
import br.com.sgs.entity.Etapa;
import br.com.sgs.entity.ModeloSolicitacao;
import br.com.sgs.entity.Solicitacao;
import br.com.sgs.fachada.*;
import br.com.sgs.util.DataValue;
import br.com.sgs.view.HeaderAndFooter;
import br.com.sgs.view.Pagination;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

        
             
        
                
/**
 *
 * @author Eric
 */
@ManagedBean(name="solicitacaoReportMB")
@ViewScoped
public class SolicitacaoReportMB implements Serializable {
    
    
    private List<Solicitacao> lssolicitacao = new ArrayList<Solicitacao>();
       
    //instituicao selecionada
    private Solicitacao solicitacaoselecionada;
    private ModeloSolicitacao modelosolicitacaoselecionada;
    
    //visualizar
    private String strdescricao;
    private String strstatus;
    private String strdepartamento;
    private String stretapaatual;
    private String strprocessoatual;
    private String stretapaatualstatus;
    private Date strdtcriacao;
    private Date strprazo;
    private String straluno;
    private String strfuncionario;
    private int strtotal;
    
    //Select One Menu
    private List<String> lsstatus = new ArrayList<String>();
    private List<SelectItem> itemstatus = new ArrayList<SelectItem>();
    private int idstatus;
    private StreamedContent file;
    
    
    /**
     * Creates a new instance of InstituicaoNew
     */
    public SolicitacaoReportMB() {
    }
    
    @PostConstruct
    public void init() {
        try {
            
            popularCombos();

        } catch (Exception e) {
            System.err.println("Erro no init do solicitacaoReportMB");
        }
    }
    
    
    public void popularCombos() {
        try {
          
            
           lsstatus = null;
           itemstatus.clear();
          
           for (DataValue lsd : SolicitacaoAux.getStatusListaAll()) {
               itemstatus.add(new SelectItem(lsd.getValue(),MessageBundleLoader.getMessage(lsd.getName())));
           }
                     

        } catch (Exception e) {
            System.err.println("Erro no popularCombos");
        }

    }
        
    public void buscar() {
        try {

            SolicitacaoIFachada ifach = new SolicitacaoFachada();
            setLssolicitacao(ifach.findSolicitacaoByAll("", null, null, lsstatus, 0, null));
            strtotal = lssolicitacao.size();
                  
            
        } catch (Exception e) {
            System.err.println("Erron no método buscar");
            e.printStackTrace();
        }
    }
    
    public void visualizar(Solicitacao solicitacao) {
        try {

            setModelosolicitacaoselecionada(solicitacao.getModeloSolicitacao());
            
            setStrdescricao(getModelosolicitacaoselecionada().getDescricao());
            setStrdtcriacao(getModelosolicitacaoselecionada().getDtcriacao());
            setStrdepartamento(solicitacao.getEtapaatual().getDepartamento().getDescricao());
            setStretapaatual(solicitacao.getEtapaatual().getDescricao());
            setStretapaatualstatus(solicitacao.getEtapaatual().getStatus().getDescricao());
            setStrprocessoatual(solicitacao.getProcessoAtual().getOrientacao());
            setStrprazo(calculaData(solicitacao.getDtcriacao(),solicitacao));
            setStraluno(solicitacao.getAluno().getNome());
            setStrfuncionario(solicitacao.getFuncionario().getNome());


        } catch (Exception e) {
            System.err.println("Erro no visualizar");
        }
    }
    
    public Date calculaData(Date data, Solicitacao solicitacao) {
        try {

            Calendar calendar = Calendar.getInstance();
            int dias = 0;

            for (Etapa etapa : solicitacao.getModeloSolicitacao().getLsetapa()) {
                dias = etapa.getPrazo();
            }

            calendar.setTime(data);
            calendar.add(Calendar.DAY_OF_MONTH, dias);
            
            data = calendar.getTime();

            return data;

        } catch (Exception e) {
            System.err.println("Erro no calcularData");
            e.printStackTrace();
            return null;
        }

    }
    
    public void generatePdfFile() {

        Image img = null;
        Document doc = null;

        try {

            //cria o documento tamanho A4, margens de 2,54cm            
            doc = new Document(PageSize.A4.rotate(), 50, 50, 50, 50);

            // criando o arquivo na memória
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            //associa a stream de saída ao documento
            PdfWriter pdfwriter = PdfWriter.getInstance(doc, baos);

            //Atribiu o footer e Pagenumber
            pdfwriter.setPageEvent(new HeaderAndFooter());
            pdfwriter.setPageEvent(new Pagination());
            
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            //abre o documento
            doc.open();

            //setando a fonte do documento
            Font font = new Font(Font.FontFamily.TIMES_ROMAN, 12);
            Font fontHeader = new Font(Font.FontFamily.TIMES_ROMAN, 12,Font.BOLD);

            //recuperando imagens
            ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
//            String logo = servletContext.getRealPath("") + File.separator + "img" + File.separator + "mario_andrade_logo.png";

//            //setando imagem no objeto
//            Image imgLogo = Image.getInstance(logo);
//            imgLogo.scaleAbsolute(62, 90);
//            imgLogo.setAlignment(Element.ALIGN_LEFT);


            //table Data
            PdfPTable table = new PdfPTable(7);
            table.setWidthPercentage(100.0f);
            table.setHorizontalAlignment(50);

            table.addCell(new Phrase(MessageBundleLoader.getMessage("descricao"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("aluno"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("colDtCriacao"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("departamento"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("colFuncionario"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("Prazo"), fontHeader));
            table.addCell(new Phrase(MessageBundleLoader.getMessage("status"), fontHeader));
           
            for (Solicitacao solicitacao : lssolicitacao) {
                table.addCell(new Phrase(solicitacao.getModeloSolicitacao().getDescricao(), font));
                table.addCell(new Phrase(solicitacao.getAluno().getNome(), font));
                table.addCell(new Phrase(sdf.format(solicitacao.getDtcriacao()), font));
                table.addCell(new Phrase(solicitacao.getEtapaatual().getDepartamento().getDescricao(), font));
                
                if (solicitacao.getFuncionario() != null) {
                    table.addCell(new Phrase(solicitacao.getFuncionario().getNome(), font));
                } else {
                    table.addCell(new Phrase("", font));
                }
                
                table.addCell(new Phrase(sdf.format(calculaData(solicitacao.getDtcriacao(), solicitacao)), font));
                table.addCell(new Phrase(strStatusLabel(solicitacao.getStatus()), font));
            }
            doc.add(table);

            //fechamento do documento
            doc.close();

            try {
                InputStream is = null;
                is = new ByteArrayInputStream(baos.toByteArray());
                setFile(new DefaultStreamedContent(is, "application/pdf", "RelatorioGerencial.pdf"));
            } catch (Exception e) {
                System.err.println("Erro no download");
                e.printStackTrace();
            }

        } catch (Exception e) {
            System.err.println("Erro no método GeneratePdfFile");
            e.printStackTrace();
        }
    }
    
    public void selecionarRegistro(Solicitacao solicitacao) {
        try {

            setSolicitacaoselecionada(solicitacao);

        } catch (Exception e) {
            System.err.println("Erro no metodo selecionarRegistro");
        }

    }
  
    
    public String strStatusLabel(int st) {
        return MessageBundleLoader.getMessage(SolicitacaoAux.getStatusLabel(st));
    }

    /**
     * @return the lssolicitacao
     */
    public List<Solicitacao> getLssolicitacao() {
        return lssolicitacao;
    }

    /**
     * @param lssolicitacao the lssolicitacao to set
     */
    public void setLssolicitacao(List<Solicitacao> lssolicitacao) {
        this.lssolicitacao = lssolicitacao;
    }

    /**
     * @return the solicitacaoselecionada
     */
    public Solicitacao getSolicitacaoselecionada() {
        return solicitacaoselecionada;
    }

    /**
     * @param solicitacaoselecionada the solicitacaoselecionada to set
     */
    public void setSolicitacaoselecionada(Solicitacao solicitacaoselecionada) {
        this.solicitacaoselecionada = solicitacaoselecionada;
    }

    /**
     * @return the modelosolicitacaoselecionada
     */
    public ModeloSolicitacao getModelosolicitacaoselecionada() {
        return modelosolicitacaoselecionada;
    }

    /**
     * @param modelosolicitacaoselecionada the modelosolicitacaoselecionada to set
     */
    public void setModelosolicitacaoselecionada(ModeloSolicitacao modelosolicitacaoselecionada) {
        this.modelosolicitacaoselecionada = modelosolicitacaoselecionada;
    }

    /**
     * @return the strdescricao
     */
    public String getStrdescricao() {
        return strdescricao;
    }

    /**
     * @param strdescricao the strdescricao to set
     */
    public void setStrdescricao(String strdescricao) {
        this.strdescricao = strdescricao;
    }

    /**
     * @return the strstatus
     */
    public String getStrstatus() {
        return strstatus;
    }

    /**
     * @param strstatus the strstatus to set
     */
    public void setStrstatus(String strstatus) {
        this.strstatus = strstatus;
    }

    /**
     * @return the strdepartamento
     */
    public String getStrdepartamento() {
        return strdepartamento;
    }

    /**
     * @param strdepartamento the strdepartamento to set
     */
    public void setStrdepartamento(String strdepartamento) {
        this.strdepartamento = strdepartamento;
    }

    /**
     * @return the stretapaatual
     */
    public String getStretapaatual() {
        return stretapaatual;
    }

    /**
     * @param stretapaatual the stretapaatual to set
     */
    public void setStretapaatual(String stretapaatual) {
        this.stretapaatual = stretapaatual;
    }

    /**
     * @return the strprocessoatual
     */
    public String getStrprocessoatual() {
        return strprocessoatual;
    }

    /**
     * @param strprocessoatual the strprocessoatual to set
     */
    public void setStrprocessoatual(String strprocessoatual) {
        this.strprocessoatual = strprocessoatual;
    }

    /**
     * @return the stretapaatualstatus
     */
    public String getStretapaatualstatus() {
        return stretapaatualstatus;
    }

    /**
     * @param stretapaatualstatus the stretapaatualstatus to set
     */
    public void setStretapaatualstatus(String stretapaatualstatus) {
        this.stretapaatualstatus = stretapaatualstatus;
    }

    /**
     * @return the strdtcriacao
     */
    public Date getStrdtcriacao() {
        return strdtcriacao;
    }

    /**
     * @param strdtcriacao the strdtcriacao to set
     */
    public void setStrdtcriacao(Date strdtcriacao) {
        this.strdtcriacao = strdtcriacao;
    }

    /**
     * @return the strprazo
     */
    public Date getStrprazo() {
        return strprazo;
    }

    /**
     * @param strprazo the strprazo to set
     */
    public void setStrprazo(Date strprazo) {
        this.strprazo = strprazo;
    }

    /**
     * @return the idstatus
     */
    public int getIdstatus() {
        return idstatus;
    }

    /**
     * @param idstatus the idstatus to set
     */
    public void setIdstatus(int idstatus) {
        this.idstatus = idstatus;
    }

    /**
     * @return the lsstatus
     */
    public List<String> getLsstatus() {
        return lsstatus;
    }

    /**
     * @param lsstatus the lsstatus to set
     */
    public void setLsstatus(List<String> lsstatus) {
        this.lsstatus = lsstatus;
    }

    /**
     * @return the itemstatus
     */
    public List<SelectItem> getItemstatus() {
        return itemstatus;
    }

    /**
     * @param itemstatus the itemstatus to set
     */
    public void setItemstatus(List<SelectItem> itemstatus) {
        this.itemstatus = itemstatus;
    }

    /**
     * @return the straluno
     */
    public String getStraluno() {
        return straluno;
    }

    /**
     * @param straluno the straluno to set
     */
    public void setStraluno(String straluno) {
        this.straluno = straluno;
    }

    /**
     * @return the strfuncionario
     */
    public String getStrfuncionario() {
        return strfuncionario;
    }

    /**
     * @param strfuncionario the strfuncionario to set
     */
    public void setStrfuncionario(String strfuncionario) {
        this.strfuncionario = strfuncionario;
    }

    /**
     * @return the strtotal
     */
    public int getStrtotal() {
        return strtotal;
    }

    /**
     * @param strtotal the strtotal to set
     */
    public void setStrtotal(int strtotal) {
        this.strtotal = strtotal;
    }

    /**
     * @return the file
     */
    public StreamedContent getFile() {
        return file;
    }

    /**
     * @param file the file to set
     */
    public void setFile(StreamedContent file) {
        this.file = file;
    }
}
